package functii;

import operatori.Produs;

/**
 * clasa Exp trateaza functia algebrica exponetiala,si mosteneste clasa
 * Functie
 * @author Sorica Alexandra
 */

public class Exp extends Functie{
	
	/**
	 * functia calcul(double aux1) calculeaza valoarea functiei intr-un anumit pct
	 * @param aux1-primeste ca argument o variabila double reprezentand
	 * valoarea in care dorim sa calculam valoarea functiei
	 * @return returneaza un double reprez valoarea fucntiei
	 */
	
	public static double calcul(double aux1){
		return Math.exp(aux1);
		}
	
	/**
	 * returneaza chiar valoarea argumentului functiei
	 */
	
	public double calcul(){
		if (ns == null)
			System.exit(1);
		return calcul(ns.calcul());
		}
	
	/**
	 * returneaza un string reprezentand derivarea functiei
	 */
	
	public String derivare(){
		if (ns == null)
			System.exit(1);
		return Produs.concatTermens(ns.derivare(),"e^"+ns.toString());          
		}
	
	/**
	 * calculeaza valoarea derivatei intr-un anumit punct
	 */
	
	public double calculDerivata(){
		if (ns == null)
			System.exit(1);
		return Produs.Calcul(ns.calculDerivata(),Math.pow(Math.E, ns.calcul()));
		}
	public String toString(){
		if (ns == null)
			System.exit(1);
		return concatTermeni(ns.toString());
		}
	
	/**
	 * este folosita pentru construirea unui sir de caractere reprez numele fuctiei si
	 * argumentul acesteia
	 * @param aux1 primeste ca argument un string reprezentand argumentul functiei
	 * @return returneaza un string reprezentand numele functiei
	 */
	
	public static String concatTermeni(String aux1){
		String aux;
		int nrP;
		nrP = aux1.charAt(0) == '(' ? 0 : 2;
		aux = "pow";
		if (nrP != 0) aux += "(e,";
		aux += aux1;
		if (nrP != 0) aux += ")";
		return aux;
		}
	public double calculeazaValoare() {
		return this.calcul();
		}
	}